package edu.uoc.vmerinom.tfc.report;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jooreports.templates.DocumentTemplateException;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import edu.uoc.vmerinom.tfc.domain.Usuario;
import edu.uoc.vmerinom.tfc.support.Message;
import edu.uoc.vmerinom.tfc.support.Utils;

/**
 * Clase que gestiona la generación de informes a través del servidor de
 * LibreOffice para el módulo de usuarios.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("usuariosReport")
@Scope(ScopeType.CONVERSATION)
public class UsuariosReport extends Reports {

	/**
	 * Ruta y nombre de la plantilla.
	 */
	static final String RUTA_PLANTILLA_LISTADO = "/libreoffice/usuarios.odt";
	/**
	 * Campo título nombre y apellidos.
	 */
	static final String TITULO_NOMBRE_APELLIDOS = "tituloNombreApellidos";
	/**
	 * Campo título teléfonos.
	 */
	static final String TITULO_TELEFONOS = "tituloTelefonos";
	/**
	 * Campo título correo electrónico.
	 */
	static final String TITULO_EMAIL = "tituloEmail";
	/**
	 * Campo título DNI.
	 */
	static final String TITULO_DNI = "tituloDNI";
	/**
	 * Campo título fecha de nacimiento.
	 */
	static final String TITULO_NACIMIENTO = "tituloNacimiento";
	/**
	 * Campo nombre apellidos.
	 */
	static final String NOMBRE_APELLIDOS = "nombreApellidos";
	/**
	 * Campo DNI.
	 */
	static final String DNI = "dni";
	/**
	 * Campo fecha de nacimiento.
	 */
	static final String NACIMIENTO = "nacimiento";
	/**
	 * Campo correo electrónico.
	 */
	static final String EMAIL = "email";
	/**
	 * Campo teléfonos.
	 */
	static final String TELEFONOS = "telefonos";
	/**
	 * Lista de usuarios.
	 */
	static final String USUARIOS = "usuarios";
	/**
	 * Listado completo de usuarios.
	 */
	List<Usuario> usuarios;

	/**
	 * Genera un listado en PDF de los usuarios que reciba.
	 * 
	 * @throws DocumentTemplateException
	 *             Excepciones producidas por el servidor de OpenOffice
	 * @throws IOException
	 *             Excepciones de entrada/salida
	 */
	public void listado() throws IOException, DocumentTemplateException {
		Map<String, Object> mapModel = new HashMap<String, Object>();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		Date date = new Date();
		mapModel.put(FECHA_HORA, sdf.format(date));
		mapModel.put(TITULO_REGISTRO, Message.get("report.users.list.title"));
		mapModel.put(TITULO_NOMBRE_APELLIDOS, Message.get("report.users.full.name"));
		mapModel.put(TITULO_TELEFONOS, Message.get("report.users.full.telephones"));
		mapModel.put(TITULO_EMAIL, Message.get("report.users.email"));
		mapModel.put(TITULO_DNI, Message.get("report.users.id.number"));
		mapModel.put(TITULO_NACIMIENTO, Message.get("report.users.birth.date"));

		List<Map<String, String>> usus = new ArrayList<Map<String, String>>();
		for (Usuario u : usuarios) {
			Map<String, String> usu = new HashMap<String, String>();
			String value = Utils.getNombreApellidos(u.getNombre(), u.getPrimerApellido(), u.getSegundoApellido());
			usu.put(NOMBRE_APELLIDOS, value);
			value = "";
			if (u.getDni() != null) {
				value = u.getDni();
			}
			usu.put(DNI, value);
			value = "";
			if (u.getNacimiento() != null) {
				sdf = new SimpleDateFormat("dd/MM/yyyy");
				value = sdf.format(u.getNacimiento());
			}
			usu.put(NACIMIENTO, value);
			value = "";
			if (u.getEmail() != null) {
				value = u.getEmail();
			}
			usu.put(EMAIL, value);
			value = "";
			if (u.getMovil() != null && !"".equals(u.getMovil())) {
				value = u.getMovil();
				if (u.getFijo() != null && !"".equals(u.getMovil())) {
					value = value + ", " + u.getFijo();
				}
			} else if (u.getFijo() != null) {
				value = u.getFijo();
			}
			usu.put(TELEFONOS, value);
			usus.add(usu);
		}
		mapModel.put(USUARIOS, usus);

		write(mapModel, "RS", RUTA_PLANTILLA_LISTADO, date);
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public List<Usuario> getUsuarios() {
		return usuarios;
	}
}
